package com.atguigu.gmall.product.controller;

import com.atguigu.gmall.common.result.Result;
import com.atguigu.gmall.product.util.FileUploadUtil;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

/**
 * @author: 封捷
 * @create-date: 2022/8/22 11:29
 */
@Api(tags = "文件上传功能")
@RestController
public class FileUploadController {

    // 文件上传后，服务器的访问地址
    // @Value 注解：表示从 YAML 配置文件读取数据，赋值给当前成员变量
    // 不做直接赋值的原因是：考虑到万一服务器地址发生变化，可以只修改配置文件不修改 Java 代码
    // 区别：修改配置文件不需要重新编译，修改 Java 代码需要重新编译、应用服务器也需要重新部署
    // 软编码：在 Java 代码中没有写死，动态读取配置文件
    // 硬编码：写死了
    @Value("${fileServer.url}")
    private String fileServerAddress;

    /**
     * 接收浏览器端上传的文件并返回有效访问地址
     * @param uploadFile 上传的文件
     * @return 封装了有效访问地址（拼接好的）
     */
    @PostMapping("/admin/product/fileUpload")
    public Result<String> doFileUpload(
            // 官方：文件上传场景，使用 @RequestPart 注解比 @RequestParam 更好
            // 注解中指定的字符串是文件上传使用的请求参数名，不要写错
            @RequestPart("file") MultipartFile file) throws IOException {

        // 检查文件是否为空
        if (file.isEmpty()) {

            Result<String> fail = Result.fail();

            fail.message("上传的文件不能为空！");

            return fail;
        }

        // 获取上传文件的字节数组
        byte[] byteArray = file.getBytes();

        // 获取上传文件的原始文件名
        String originalFilename = file.getOriginalFilename();

        // 执行文件上传，返回值是完整访问地址的后半部分
        String fileAccessPath = FileUploadUtil.doFileUpload(byteArray, originalFilename);

        // 拼接完整的访问地址
        String fullAccessPath = fileServerAddress + fileAccessPath;

        return Result.ok(fullAccessPath);
    }

}
